1   /*
2    * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4    *
5    * This code is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU General Public License version 2 only, as
7    * published by the Free Software Foundation.  Oracle designates this
8    * particular file as subject to the "Classpath" exception as provided
9    * by Oracle in the LICENSE file that accompanied this code.
10   *
11   * This code is distributed in the hope that it will be useful, but WITHOUT
12   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14   * version 2 for more details (a copy is included in the LICENSE file that
15   * accompanied this code).
16   *
17   * You should have received a copy of the GNU General Public License version
18   * 2 along with this work; if not, write to the Free Software Foundation,
19   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20   *
21   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22   * or visit www.oracle.com if you need additional information or have any
23   * questions.
24   */
25  package com.sun.media.sound;
26  
27  import java.io.IOException;
28  import javax.sound.midi.Instrument;
29  import javax.sound.midi.MidiChannel;
30  import javax.sound.midi.Patch;
31  import javax.sound.midi.Soundbank;
32  import javax.sound.midi.SoundbankResource;
33  import javax.sound.midi.VoiceStatus;
34  
35  /**
36   * A abstract class used to simplify creating custom ModelOscillator.
37   *
38   * @author Karl Helgason
39   */
40  public abstract class ModelAbstractOscillator
41          implements ModelOscillator, ModelOscillatorStream, Soundbank {
42  
43      protected float pitch = 6000;
44      protected float samplerate;
45      protected MidiChannel channel;
46      protected VoiceStatus voice;
47      protected int noteNumber;
48      protected int velocity;
49      protected boolean on = false;
50  
51      public void init() {
52      }
53  
54      public void close() throws IOException {
55      }
56  
57      public void noteOff(int velocity) {
58          on = false;
59      }
60  
61      public void noteOn(MidiChannel channel, VoiceStatus voice, int noteNumber,
62              int velocity) {
63          this.channel = channel;
64          this.voice = voice;
65          this.noteNumber = noteNumber;
66          this.velocity = velocity;
67          on = true;
68      }
69  
70      public int read(float[][] buffer, int offset, int len) throws IOException {
71          return -1;
72      }
73  
74      public MidiChannel getChannel() {
75          return channel;
76      }
77  
78      public VoiceStatus getVoice() {
79          return voice;
80      }
81  
82      public int getNoteNumber() {
83          return noteNumber;
84      }
85  
86      public int getVelocity() {
87          return velocity;
88      }
89  
90      public boolean isOn() {
91          return on;
92      }
93  
94      public void setPitch(float pitch) {
95          this.pitch = pitch;
96      }
97  
98      public float getPitch() {
99          return pitch;
100     }
101 
102     public void setSampleRate(float samplerate) {
103         this.samplerate = samplerate;
104     }
105 
106     public float getSampleRate() {
107         return samplerate;
108     }
109 
110     public float getAttenuation() {
111         return 0;
112     }
113 
114     public int getChannels() {
115         return 1;
116     }
117 
118     public String getName() {
119         return getClass().getName();
120     }
121 
122     public Patch getPatch() {
123         return new Patch(0, 0);
124     }
125 
126     public ModelOscillatorStream open(float samplerate) {
127         ModelAbstractOscillator oscs;
128         try {
129             oscs = this.getClass().newInstance();
130         } catch (InstantiationException e) {
131             throw new IllegalArgumentException(e);
132         } catch (IllegalAccessException e) {
133             throw new IllegalArgumentException(e);
134         }
135         oscs.setSampleRate(samplerate);
136         oscs.init();
137         return oscs;
138     }
139 
140     public ModelPerformer getPerformer() {
141         // Create performer for my custom oscillirator
142         ModelPerformer performer = new ModelPerformer();
143         performer.getOscillators().add(this);
144         return performer;
145 
146     }
147 
148     public ModelInstrument getInstrument() {
149         // Create Instrument object around my performer
150         SimpleInstrument ins = new SimpleInstrument();
151         ins.setName(getName());
152         ins.add(getPerformer());
153         ins.setPatch(getPatch());
154         return ins;
155 
156     }
157 
158     public Soundbank getSoundBank() {
159         // Create Soundbank object around the instrument
160         SimpleSoundbank sbk = new SimpleSoundbank();
161         sbk.addInstrument(getInstrument());
162         return sbk;
163     }
164 
165     public String getDescription() {
166         return getName();
167     }
168 
169     public Instrument getInstrument(Patch patch) {
170         Instrument ins = getInstrument();
171         Patch p = ins.getPatch();
172         if (p.getBank() != patch.getBank())
173             return null;
174         if (p.getProgram() != patch.getProgram())
175             return null;
176         if (p instanceof ModelPatch && patch instanceof ModelPatch) {
177             if (((ModelPatch)p).isPercussion()
178                     != ((ModelPatch)patch).isPercussion()) {
179                 return null;
180             }
181         }
182         return ins;
183     }
184 
185     public Instrument[] getInstruments() {
186         return new Instrument[]{getInstrument()};
187     }
188 
189     public SoundbankResource[] getResources() {
190         return new SoundbankResource[0];
191     }
192 
193     public String getVendor() {
194         return null;
195     }
196 
197     public String getVersion() {
198         return null;
199     }
200 }